package com.zjq.smartdevice.service.impl;

import com.zjq.smartdevice.cache.SceneCache;
import com.zjq.smartdevice.enums.CheckType;
import com.zjq.smartdevice.exception.AddDataErrorException;
import com.zjq.smartdevice.exception.MyErrorCode;
import com.zjq.smartdevice.exception.QueryDataErrorException;
import com.zjq.smartdevice.mapper.SysSceneMapper;
import com.zjq.smartdevice.pojo.SysScene;
import com.zjq.smartdevice.pojo.SysUserInfo;
import com.zjq.smartdevice.service.SysSceneService;
import com.zjq.smartdevice.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import java.util.Date;

/**
 * @User zhangjiaqi
 * @Project project
 * @Package com.zjq.smartdevice.service.impl
 * @Date 2022/3/22 14:58
 */
@Service
@Transactional
public class SysSceneServiceImpl implements SysSceneService {

    private SceneCache sceneCache;

    @Autowired
    public void setSceneCache(SceneCache sceneCache) {
        this.sceneCache = sceneCache;
    }

    private SysSceneMapper sysSceneMapper;

    @Autowired
    public void setSysSceneMapper(SysSceneMapper sysSceneMapper) {
        this.sysSceneMapper = sysSceneMapper;
    }

    @Override
    public void addSysScene(SysScene sysScene) {
        Assert.isTrue(!sysScene.isEmpty(CheckType.ADD),()->{
            throw new AddDataErrorException("场景的名称没有传递", MyErrorCode.DATA_NULL);
        });
        //必须登录
        //检查当前是不是登录了用户,如何判断用户登录了, 所以一定有个地方保存了登录的用户(数据到底保存在什么地方是我们决定的),我们登录完成后放到session了
        //那我们只需要从session中获取
        SysUserInfo userInfo = SecurityUtils.getLoginUser();
        //我们要求必须登录
        Assert.notNull(userInfo,()->{
            throw new AddDataErrorException("未登陆", MyErrorCode.NOT_LOGIN);
        });
        //同一个用户同名的场景只能添加一个(我们的需求)
        //我们不能给表设计名字是唯一的,这样所有的用户只能有一个人能创建这个名字,我们的要求是每个用户同样的数据唯一

        SysScene scene = sysSceneMapper.findByUserAndName(userInfo.getUId(), sysScene.getSceneName());

        //根据用户和场景的名字查询数据,如果能查询到,则代表存在(检查是不是被标记为删除),查询不到,就表示存在
        //如果数据已经存在,但是是删除状态,我们就更新,如果不存在我们就添加.否则就抛出异常
        Assert.isTrue(scene == null || scene.getStatus() == 0, () -> {
            throw new AddDataErrorException("场景已经存在", MyErrorCode.DATA_ALREADY_EXIST);
        });

        if (scene == null) {//添加
            //补全数据
            sysScene.setCreateBy(userInfo.getUId());
            sysScene.setCreateTime(new Date());
            sysSceneMapper.addSysScene(sysScene);
        } else {//删除状态
            //更新
            sysSceneMapper.updateStatus(scene.getSceneId(), 1L);//更新为启用
        }

    }

    @Override
    public SysScene findById(Long id) {
        SysUserInfo userInfo = SecurityUtils.getLoginUser();
        Assert.notNull(userInfo,()->{
            throw new AddDataErrorException("未登陆", MyErrorCode.NOT_LOGIN);
        });
        //查询数据的时候需要id和当前用户进行查询
        //方式1: 查询数据库的条件就是主键和用户的id
        //方式2: 根据主键查询数据,然后代码中判断用户
        //从缓存中查询

        SysScene sysScene = sceneCache.get(id);

//        Assert.notNull(sysScene.getSceneId(), () -> {
//            throw new QueryDataErrorException("数据不存在", MyErrorCode.DATA_NULL);
//        });

//        Assert.isTrue(sysScene.getCreateBy() == userInfo.getUId(), () -> {
//            throw new QueryDataErrorException("数据不存在", MyErrorCode.DATA_NULL);
//        });
        //合并为一个断言
        Assert.isTrue(sysScene.getSceneId() != null && sysScene.getCreateBy() == userInfo.getUId(), () -> {
            throw new QueryDataErrorException("数据不存在", MyErrorCode.DATA_NULL);
        });
        return sysScene;
    }
}
